home *** CD-ROM | disk | FTP | other *** search
- 100 REMark CPUTEST_BAS SNG v0.36 October 1994
- 105 REMark with WARP ENGINE refinements
- 110 REMark Uses various TK2 extensions
- 120 :
- 130 STOP
- 290 :
- 300 DEFine PROCedure S
- 310 SAVE_O FLP1_CPUTEST_BAS
- 320 END DEFine S
- 330 :
- 340 REMark Access control for 68040 series processors - SNG
- 350 REMark EC chips support all these except MMU_ON, REMAP
- 360 REMark and MMU_OFF. COPYBACK uses the ATU/TTU globally
- 370 REMark so it should not be used with fast RAM re-mapped.
- 380 :
- 390 DEFine PROCedure COPYBACK
- 400 x=ALCHP(20)
- 410 POKE_W x,20032:REMark SV mode
- 420 POKE_W x+2,8764:REMark Load D1
- 430 POKE_W x+4,HEX("00FF"):REMark all memory
- 440 POKE_W x+6,HEX("C000"):REMark Copyback cache
- 450 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 460 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
- 470 POKE_W x+12,636:REMark User mode
- 480 POKE_W x+14,-9985
- 490 POKE_W x+16,HEX("7000")
- 500 POKE_W x+18,HEX("4E75")
- 510 CALL x
- 520 RECHP x
- 530 END DEFine COPYBACK
- 540 :
- 550 DEFine PROCedure CACHE_ON
- 560 x=ALCHP(22)
- 570 POKE_W x,20032:REMark SV mode
- 580 POKE_W x+2,HEX("F4D8"):REMark CINVA ic/dc
- 590 POKE_W x+4,8764:REMark Load D1
- 600 POKE_W x+6,HEX("8000"):REMark Data on
- 610 POKE_W x+8,HEX("8000"):REMark Code on
- 620 POKE_W x+10,BIN("0100111001111011"):REMark MOVEC
- 630 POKE_W x+12,HEX("1002"):REMark Move D1 to CCR
- 640 POKE_W x+14,636:REMark User mode
- 650 POKE_W x+16,-9985
- 660 POKE_W x+18,HEX("7000")
- 670 POKE_W x+20,HEX("4E75")
- 680 CALL x
- 690 RECHP x:REMark Phew
- 700 END DEFine CACHE_ON
- 710 :
- 720 DEFine PROCedure MMU_OFF
- 730 REMark Not applicable to 68EC040
- 740 x=ALCHP(20)
- 750 POKE_W x,20032:REMark SV mode
- 760 POKE_W x+2,8764:REMark Load D1
- 770 POKE_W x+4,HEX("0000"):REMark Disable MMU
- 780 POKE_W x+6,HEX("0000")
- 790 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 800 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
- 810 POKE_W x+12,636:REMark User mode
- 820 POKE_W x+14,-9985
- 830 POKE_W x+16,HEX("7000")
- 840 POKE_W x+18,HEX("4E75")
- 850 CALL x
- 860 RECHP x
- 870 END DEFine MMU_OFF
- 880 :
- 890 DEFine PROCedure WRITE_THROUGH
- 900 REMark Amiga 4000 fast RAM only
- 910 x=ALCHP(20)
- 920 POKE_W x,20032:REMark SV mode
- 930 POKE_W x+2,8764:REMark Load D1
- 940 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for std. A4000 'fast'
- 945 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
- 950 POKE_W x+6,HEX("C020"):REMark Write-through cache
- 960 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 970 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
- 980 POKE_W x+12,636:REMark User mode
- 990 POKE_W x+14,-9985
- 1000 POKE_W x+16,HEX("7000")
- 1010 POKE_W x+18,HEX("4E75")
- 1020 CALL x
- 1030 RECHP x
- 1040 END DEFine WRITE_THROUGH
- 1050 :
- 1060 DEFine PROCedure CACHE_OFF
- 1070 x=ALCHP(22)
- 1080 POKE_W x,20032:REMark SV mode
- 1090 POKE_W x+2,8764:REMark Load D1
- 1100 POKE_L x+4,0:REMark Data off, code off
- 1110 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 1120 POKE_W x+10,HEX("1002"):REMark Move D1 to CCR
- 1130 POKE_W x+12,HEX("F4F8"):REMark CPUSH ic/dc
- 1140 POKE_W x+14,636:REMark User mode
- 1150 POKE_W x+16,-9985
- 1160 POKE_W x+18,HEX("7000")
- 1170 POKE_W x+20,HEX("4E75")
- 1180 CALL x
- 1190 RECHP x:REMark Phew
- 1200 END DEFine CACHE_OFF
- 1210 :
- 1220 DEFine PROCedure SERIALIZE
- 1230 REMark Amiga 4000 fast RAM only
- 1240 x=ALCHP(20)
- 1250 POKE_W x,20032:REMark SV mode
- 1260 POKE_W x+2,8764:REMark Load D1
- 1270 REMark POKE_W x+4,HEX("07F8"):REMark From 07000000 up for Motherboard RAM
- 1275 POKE_W x+4,HEX("08F7"):REMark From 08000000 up for WARP 4..16 very fast RAM
- 1280 POKE_W x+6,HEX("C040"):REMark Serialized, no cache
- 1290 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 1300 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0
- 1310 POKE_W x+12,636:REMark User mode
- 1320 POKE_W x+14,-9985
- 1330 POKE_W x+16,HEX("7000")
- 1340 POKE_W x+18,HEX("4E75")
- 1350 CALL x
- 1360 RECHP x
- 1370 END DEFine SERIALIZE
- 1380 :
- 1390 DEFine PROCedure ACRS_OFF
- 1400 REMark Disables all four ACR/TTR registers
- 1405 REMark NEEDS the code CACHE to be OFF!
- 1410 LOCal r,x
- 1420 x=ALCHP(20)
- 1430 POKE_W x,20032:REMark SV mode
- 1440 POKE_W x+2,8764:REMark Load D1
- 1450 POKE_W x+4,HEX("00FF"):REMark All of memory
- 1460 POKE_W x+6,0:REMark Turn it off
- 1470 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 1480 POKE_W x+10,HEX("1006"):REMark Move D1 to DTT0 etc
- 1490 POKE_W x+12,636:REMark User mode
- 1500 POKE_W x+14,-9985
- 1510 POKE_W x+16,HEX("7000")
- 1520 POKE_W x+18,HEX("4E75")
- 1530 FOR r=4 TO 7:POKE x+11,r:CALL x
- 1540 RECHP x
- 1550 END DEFine ACRS_OFF
- 1560 :
- 1570 DEFine FuNction GETC(n)
- 1580 LOCal x:REMark r
- 1590 IF n<0 OR n>4095 : PRINT #0;"Bad CR " & n : STOP
- 1600 x=ALCHP(20)
- 1610 POKE_W x,20032:REMark SV mode
- 1620 POKE_W x+2,BIN("0100111001111010"):REMark MOVEC
- 1630 POKE_W x+4,4096+n:REMark Move CR to D1
- 1640 POKE_W x+6,636:REMark User mode
- 1650 POKE_W x+8,-9985
- 1660 POKE_W x+10,HEX("41FA") :REMark LEA x,A0
- 1670 POKE_W x+12,-12
- 1680 POKE_W x+14,HEX("2081") :REMark MOVE.L D1,(A0)
- 1690 POKE_W x+16,HEX("7000") :REMark MOVEQ #0,D0
- 1700 POKE_W x+18,HEX("4E75") :REMark RTS
- 1710 CALL x
- 1720 r=PEEK_L(x)
- 1730 RECHP x
- 1740 RETurn r
- 1750 END DEFine GETC
- 1760 :
- 1770 DEFine FuNction PAGE(q,size)
- 1780 RETurn INT(q/size)*size
- 1790 END DEFine PAGE
- 1800 :
- 1810 DEFine PROCedure SHOW_MMU
- 1820 REMark Uses TK2 PRINT_USING
- 1830 CLS
- 1840 PRINT "Logical",,"Physical","Mode",,"State"
- 1850 root=GETC(2055)
- 1860 SHOW_PTRS root,1
- 1870 END DEFine SHOW_MMU
- 1880 :
- 1890 DEFine PROCedure SHOW_PTRS(base,level)
- 1900 LOCal b,i,j,k,m
- 1910 m=0
- 1920 FOR i=base TO base+127*4 STEP 4
- 1930 j=PEEK_L(i)
- 1940 IF level=1
- 1950 PRINT m & ".." & (m+31) & " Mb ",
- 1960 k=PAGE(j,512)
- 1970 m=m+32
- 1980 ELSE
- 1990 PRINT ,"+ " & m & ".." & (m+255) & " Kb ";
- 2000 k=PAGE(j,128):REMark Assume 8K pages, 256 if 4K
- 2010 m=m+256
- 2020 END IF
- 2030 b=j-k
- 2040 IF b && 2
- 2050 PRINT_USING "##########",k
- 2060 IF b && 4
- 2070 PRINT ,"READ ONLY",
- 2080 ELSE
- 2090 PRINT ,"read/write",
- 2100 END IF
- 2110 IF b && 64
- 2120 PRINT"serialized",
- 2130 ELSE
- 2140 PRINT "cacheable",
- 2150 END IF
- 2160 PRINT "in use"
- 2170 IF level=1: SHOW_PTRS k,2
- 2180 ELSE
- 2190 PRINT "unused"
- 2200 END IF
- 2210 END FOR i
- 2220 END DEFine SHOW_PTRS
- 2230 :
- 2240 DEFine PROCedure REMAP
- 2250 REMark For 8K pages, tested with 2 Mb chip, 4 and 8 Mb fast RAM;
- 2260 REMark allocates tables to put 4..8 megs fast RAM just after chip
- 2270 REMark Copyright 1994 Simon N Goodwin, version 0.36, WARP ENGINE
- 2280 REMark Written for clarity and easy tweaks rather than efficiency
- 2290 :
- 2300 MMU_OFF:REMark Run this from 2 meg chip Qdos
- 2310 PATCH_ACRS_OFF:REMark Stop ROM using ACRS
- 2320 REMark root=HEX("08000000")-32768:REMark 32K below top of A4000 motherboard 'fast' RAM
- 2325 root=HEX("08800000")-32768:REMark 32K below top of Warp Engine 8 Meg very fast RAM
- 2330 REMark change this if your fast RAM is anywhere else
- 2340 xtra=512:REMark 8192 byte FAST page count beyond 4Mb e.g. 512 for 8Mb
- 2350 REMark MMU Descriptor bit patterns
- 2360 resident=3 :REMark this memory exists
- 2370 serialized=2^6 :REMark non-cacheable memory
- 2380 write_protect=2^2 :REMark read-only memory
- 2390 :
- 2400 REMark Clear the entire root table
- 2410 FOR i=root TO root+127*4 STEP 4
- 2420 POKE_L i,0 :REMark Mark section as invalid
- 2430 END FOR i
- 2440 :
- 2450 REMark Make room for the pointer table
- 2460 pointers=root+128*4 :REMark Table for 00000000 to 01FFFFFF logical
- 2470 POKE_L root+0*4,pointers+resident :REMark Turn the first 32 Mb on
- 2480 :
- 2490 REMark Set up pointer table entries for each 256K area
- 2500 pages=pointers+128*4 :REMark Base of area for 64 page tables
- 2510 REMark The first 10 Mb is resident RAM
- 2520 FOR table=0 TO 39
- 2530 POKE_L pointers+table*4,pages+table*32*4+resident
- 2540 END FOR table
- 2550 REMark Map 6 megs from A00000 to 16 Mb as serialized for I/O
- 2560 FOR table=40 TO 63
- 2570 POKE_L pointers+table*4,pages+table*32*4+resident
- 2580 END FOR table
- 2590 REMark Clear the second half of the 32 Mb pointer-level table
- 2600 FOR i=pointers+64*4 TO pages-1 STEP 4
- 2610 POKE_L i,0
- 2620 END FOR i
- 2630 :
- 2640 REMark Map the first 256K (32 x 8K pages)
- 2650 base=0
- 2660 REMark The first 48K is NOT YET write-protected
- 2670 FOR i=pages TO pages+5*4 STEP 4
- 2680 POKE_L i,base+resident:REMark +write_protect
- 2690 base=base+8192
- 2700 END FOR i
- 2710 :
- 2720 REMark The next 16K allows read/write
- 2730 POKE_L pages+6*4,base+resident
- 2740 POKE_L pages+7*4,base+8192+resident
- 2750 base=base+2*8192
- 2760 :
- 2770 REMark Then comes 64K of serialized non-cacheable I/O area
- 2780 FOR i=pages+8*4 TO pages+15*4 STEP 4
- 2790 POKE_L i,base+serialized+resident
- 2800 base=base+8192
- 2810 END FOR i
- 2820 :
- 2830 REMark Sort out the first 128K of 'real' Qdos RAM
- 2840 FOR i=pages+16*4 TO pages+31*4 STEP 4
- 2850 POKE_L i,base+resident
- 2860 base=base+8192
- 2870 END FOR i
- 2880 :
- 2890 REMark That's the first 256K of chip mapped;
- 2900 REMark the remaining 1.75 megs is orthogonal
- 2910 FOR i=pages+32*4 TO pages+255*4 STEP 4
- 2920 POKE_L i,base+resident
- 2930 base=base+8192
- 2940 END FOR i
- 2950 :
- 2960 REMark Fast RAM starts thereafter
- 2970 base=HEX("08000000"):REMark Warp Engine 1..128 Mb FAST
- 2975 REMark base=HEX("07C00000")-xtra*8192:REMark A4000, 4Mb+
- 2980 FOR i=pages+256*4 TO pages+(256+xtra+512-1-4)*4 STEP 4
- 2990 POKE_L i,base+resident
- 3000 base=base+8192
- 3010 END FOR i
- 3020 :
- 3030 REMark The last 32K of RAM is reserved for mapping
- 3040 REMark It is read-only with cacheing disabled (?)
- 3050 FOR i=pages+(256+512+xtra-4)*4 TO pages+(256+xtra+512-1)*4 STEP 4
- 3060 POKE_L i,base+resident+write_protect+serialized
- 3070 base=base+8192
- 3080 END FOR i
- 3090 IF NOT xtra
- 3100 FOR i=pages+(256+512+xtra)*4 TO pages+(256+512+512-1)*4 STEP 4
- 3110 POKE_L i,0 :REMark Mark as absent
- 3120 END FOR i
- 3130 END IF
- 3140 :
- 3150 REMark Echo the 6 megs of 68000 I/O space
- 3160 base=HEX("A00000")
- 3170 FOR i=pages+(256+512+512)*4 TO pages+2047*4 STEP 4
- 3180 POKE_L i,base+resident+serialized
- 3190 base=base+8192
- 3200 END FOR i
- 3210 :
- 3220 ACRS_OFF
- 3230 SET_MMU_BASES root
- 3240 CACHE_OFF
- 3250 MMU_ON
- 3260 WRITE_THROUGH :REMark Echo fast RAM in old place
- 3275 CACHE_ON
- 3280 REMark Set limit of QDOS to remapped RAMtop-64K
- 3290 REMark here, reset to contiguous 6 Mb Qdos setup
- 3295 PRINT "Fast RAM remapped, resetting..."
- 3297 PAUSE 100
- 3300 RESET_TOP 2^21,3*(2^21)-2^16
- 3310 END DEFine REMAP
- 3320 :
- 3330 DEFine PROCedure MMU_ON
- 3340 REMark Not applicable to 68EC040
- 3350 x=ALCHP(20)
- 3360 POKE_W x,20032:REMark SV mode
- 3370 POKE_W x+2,8764:REMark Load D1
- 3380 POKE_W x+4,HEX("0000"):REMark Enable MMU
- 3390 POKE_W x+6,HEX("C000")
- 3400 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 3410 POKE_W x+10,HEX("1003"):REMark Move D1 to TCR
- 3420 POKE_W x+12,636:REMark User mode
- 3430 POKE_W x+14,-9985
- 3440 POKE_W x+16,HEX("7000")
- 3450 POKE_W x+18,HEX("4E75")
- 3460 CALL x
- 3470 RECHP x
- 3480 END DEFine MMU_ON
- 3490 :
- 3500 DEFine PROCedure SET_MMU_BASES(here)
- 3510 REMark Not applicable to 68EC040
- 3520 x=ALCHP(20)
- 3530 POKE_W x,20032:REMark SV mode
- 3540 POKE_W x+2,8764:REMark Load D1
- 3550 POKE_L x+4,here
- 3560 POKE_W x+8,BIN("0100111001111011"):REMark MOVEC
- 3570 POKE_W x+10,HEX("1806"):REMark Move D1 to URP
- 3580 POKE_W x+12,636:REMark User mode
- 3590 POKE_W x+14,-9985
- 3600 POKE_W x+16,HEX("7000")
- 3610 POKE_W x+18,HEX("4E75")
- 3620 CALL x
- 3630 POKE x+11,7:REMark Change URP to SRP
- 3640 CALL x
- 3650 RECHP x
- 3660 END DEFine SET_MMU_BASES
- 3670 :
- 3680 DEFine PROCedure TIMER
- 3690 time=DATE+1:REPeat l:IF time=DATE:EXIT l
- 3700 FOR i=1 TO 20000 : REMark Wait!
- 3710 time=DATE-time
- 3720 PRINT time;" seconds for 100,000 FOR loops"
- 3730 END DEFine TIMER
- 3740 :
- 3750 DEFine PROCedure CREPORT
- 3760 REMark OPEN_NEW #3,scr
- 3765 REMark INK #3,7
- 3770 FOR i=0 TO 7,2048 TO 2055
- 3780 IF i<>2050
- 3790 PRINT i,HEX$(GETC(i),32),GETC(i)
- 3800 END IF :REMark Skip CAAR, 020 & 030 only
- 3810 END FOR i
- 3820 REMark CLOSE #3
- 3830 END DEFine CREPORT
- 3840 :
- 4080 DEFine PROCedure MAP_MEGS
- 4085 mb=2^20
- 4090 FOR i=1 TO 256
- 4100 PRINT i,:PRINT PEEK(i*mb)
- 4110 END FOR i
- 4120 END DEFine MAP_MEGS
-